/**
 * 购物车模块的 Store
 */
export default {
  namespaced: true, // 开启命名空间
  state: () => ({
    // 商品的 id，商品的名称，商品的价格，商品的数据（每次加1），商品的小图片，商品的购买状态
    // { goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
    // 将存储到本地的 cart 取出 赋值
    cart: JSON.parse(uni.getStorageSync('cart') || '[]')
  }),

  // 模块的 mutations 方法
  mutations: {    
    // 添加商品到购物车
    addToCart (state, goodsInfo) {
      // 首先查找在 cart 中是否存在同名商品，返回该商品
      const findResult = state.cart.find(item => item.goods_id === goodsInfo.goods_id)
      
      // 如果存在，只需要让商品的数量 + 1
      if (findResult) {
        findResult.goods_count += 1
      } else {
        // 如果不存在同名商品，则将该商品添加到 cart 中
        state.cart.push(goodsInfo)
      }
      
      this.commit('m_cart/saveToStorage')
    },
    
    // 更新商品状态
     updateGoodsState (state, goodsInfo) {
       // 查找在 cart 中是否存在同名商品，返回该商品
       const findResult = state.cart.find(item => item.goods_id === goodsInfo.goods_id)
       
       // 如果存在
       if (findResult) {
         // 更新对应商品的勾选状态
         findResult.goods_state = goodsInfo.goods_state
         
         // 持久化到本地
         this.commit('m_cart/saveToStorage')
       }
     },
     
     // 更新商品的数量
     updateGoodsCount (state, goodsInfo) {
       // 查找在 cart 中是否存在同名商品，返回该商品
       const findResult = state.cart.find(item => item.goods_id === goodsInfo.goods_id)
       
       // 如果存在
       if (findResult) {
         // 更新对应商品的数量
         findResult.goods_count = goodsInfo.goods_count
         
         // 持久化到本地
         this.commit('m_cart/saveToStorage')
       }
     },
     
     // 全选和全不选
     updateAllGoodsState (state, newState) {
       // 遍历 更新 购物车中每件商品的勾选状态
       state.cart.forEach(item => item.goods_state = newState)
       
       // 持久化到本地
       this.commit('m_cart/saveToStorage')
     },
     
    // 将购物车数据持久化存储到本地
    saveToStorage (state) {
      uni.setStorageSync('cart', JSON.stringify(state.cart))
    }
    
  },
    
  // 模块的 getters 属性
  getters: {
    // 计算已经勾选的商品的总价格
    checkedGoodsAmount (state) {
      return state.cart.filter(item => item.goods_state)
      .reduce((total, item) => total += item.goods_count * item.goods_price, 0)
      .toFixed(2)
    },
    
    // 计算已经勾选的商品总数量
    checkedCount (state) {
      // 首先需要调用 filter 方法，动态筛选出已经勾选的商品，产生一个数组
      // 然后调用 reduce 方法，实现数据的累加
      /**
       * reduce 有四个参数
       * 第一个：累加器，每次累加之后产生的结果
       * 第二个：是当前需要处理的某一项数据，这里是指 调用 reduce 方法的数组 --- 数组中的每一项
       * */
       // reduce 第二个参数： 初始值，代表基于哪一个值来进行累加计算
      return state.cart.filter(item => item.goods_state)
      .reduce((total, item) => total += item.goods_count, 0)
    },
    
    // 动态计算购物车中需要购买的商品总数量
    total (state) {
      // 定义一个累加器
      let allGoodsCount = 0
      // 对数据进行遍历，累加计算商品数量
      state.cart.forEach(item => allGoodsCount += item.goods_count)
      // 返回计算后的结果
      return allGoodsCount
    }
    
  }
}